﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;



namespace DDD.Core {

    using Vector3 = Vector3<float>;

    /// <summary>
    /// コリジョンをあらわす構造体
    /// </summary>
    /// <remarks>
    /// コリジョン検出の結果をカプセル化します。
    /// <see cref="Physics3D.Collide"/> によってコリジョンが検出されると、
    /// この <see cref="Collision"/> 構造体に衝突情報が格納されて <see cref="Component.OnCollisionEnter()"/> が呼び出されます。
    /// ユーザーが <see cref="Collision"/> 型のインスタンスを作成する事はできず、
    /// 必ずエンジン側が作成したものを戻り値で受け取ります。
    /// 衝突検出の詳細については、 <see cref="CollisionVolume"/> クラスの解説を参照してください。
    /// </remarks>
    /// <seealso cref="CollisionVolume"/>
    public struct Collision {

        /// <summary>
        /// コンストラクター
        /// </summary>
        /// <param name="x">衝突地点のX座標</param>
        /// <param name="y">衝突地点のY座標</param>
        /// <param name="z">衝突地点のZ座標</param>
        /// <param name="nx">衝突地点の法線のX</param>
        /// <param name="ny">衝突地点の法線のY</param>
        /// <param name="nz">衝突地点の法線のZ</param>
        /// <param name="collider">衝突した相手ノード</param>
        public Collision (float x, float y, float z, float nx, float ny, float nz, Node collider) : this(){
            this.Position = new Vector3 (x, y, z);
            this.Normal = new Vector3 (nx, ny, nz);
            this.Collider = collider;
        }

        /// <summary>
        /// 衝突位置
        /// </summary>
        public Vector3 Position { get; private set; }

        /// <summary>
        /// 衝突法線
        /// </summary>
        public Vector3 Normal { get; private set; }

        /// <summary>
        /// 衝突の相手
        /// </summary>
        public Node Collider { get; private set; }

        /// <inheritdoc/>
        public override string ToString () {
            return string.Format("Collision : Position={0}, Normal={1}, Collider={2}", Position, Normal, Collider);
        }
    }
}
